package com.ylw.project.handler.chain.impl;

import com.ylw.project.handler.Handler;
import com.ylw.project.handler.chain.HandlerChain;
import com.ylw.util.Config;
import org.apache.log4j.Logger;

import java.util.List;

public class HandlerChainImpl implements HandlerChain, Runnable {

    private final static Logger logger = Logger.getLogger(HandlerChainImpl.class);

    /**
     * Handlers 用来做具体文件处理的，类似与过滤器
     * 这里有个严重问题，因为这样就是所有的线程使用的是同一个handler导致static变量很难受
     */
    private final static List<Handler> handlers;
    //文件路径初始化之后就不可以修改了
//    private final  static ThreadLocal<String> filepath;  //当用主线程初始化时，这个值特么没办法传到子线程的
//    private final static ThreadLocal<Integer> pos;

    private String filePath;
    private Integer pos;

    static {
        handlers = Config.getHandlersClass();
    }


    public HandlerChainImpl(String filepath) {
        this.filePath = filepath;
        pos = 0;
    }


    @Override
    public void doHandler(Handler handler) {
        logger.info("begin do " + handler);
        if(handler == null){
            return;
        }
        handler.handler(this, getFilePath());
    }

    public void doHandler() {
        if (handlers != null && handlers.size() > 0) {
            doHandler(handlers.get(0));
        }
    }

    @Override
    public void run() {
        doHandler();
    }

    /**
     * 获取下一个Handler,并修改当前pos的值
     *
     * @return
     */
    @Override
    public Handler nextHandler() {
        pos = pos + 1;
        if (pos > 0 && pos < handlers.size()) {
            return handlers.get(pos);
        }else{
            return null;
        }
    }

    private String getFilePath() {
        return filePath;
    }
}
